package com.buaa.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class FilterUtils {

	/**
	 * 字符过滤器
	 * 
	 * @param str
	 *            字符串
	 * @param symbol
	 *            标点符号的集合
	 * @param fault
	 *            若出错的返回值
	 * @param status
	 *            0 : 纯中文字符串判断 1 : 过滤纯中文字符串 2 : 纯英文字符串判断 3 : 过滤纯英文字符串 4 :
	 *            中英文字符串判断 5 : 过滤中英文字符串 default:过滤中英文字符串
	 * @return
	 */
	public static String characterFilter(String str, Set<Character> symbol, String fault, int status) {
		if (str == null)
			return fault;
		str = str.trim();
		switch (status) {
		case 0:
			return StringUtils.isZH(str, symbol) ? str : fault;
		case 1:
			return StringUtils.filterZH(str, symbol);
		case 2:
			return StringUtils.isEN(str, symbol) ? str : fault;
		case 3:
			return StringUtils.filterEN(str, symbol);
		case 4:
			return StringUtils.isZHEN(str, symbol) ? str : fault;
		default:
			return StringUtils.filterZHEN(str, symbol);
		}
	}

	/**
	 * 字符串模式匹配过滤
	 * 
	 * @param str
	 *            字符串
	 * @param regEx
	 *            正则表达式
	 * @param fault
	 *            若不匹配的返回值
	 * @return
	 */
	public static String patternFilter(String str, String regEx, String fault) {
		// String regEx = "^[\u4E00-\u9FA5]+(,[\u4E00-\u9FA5]+)*$";
		Pattern p = Pattern.compile(regEx);
		Matcher matcher = p.matcher(str);
		return matcher.matches() ? str : fault;

	}

	/**
	 * 长整形字符串模式匹配过滤
	 * 
	 * @param str
	 *            字符串
	 * @param regEx
	 *            正则表达式
	 * @param fault
	 *            若不匹配的返回值
	 * @return
	 */
	public static Long longPatternFilter(String str, String regEx, long fault) {
		// String regEx = "^[\u4E00-\u9FA5]+(,[\u4E00-\u9FA5]+)*$";
		Pattern p = Pattern.compile(regEx);
		Matcher matcher = p.matcher(str);
		return matcher.matches() ? Long.parseLong(str) : fault;
	}

	/**
	 * 整型过滤器
	 * 
	 * @param str
	 * @return
	 */
	public static Integer integerFilter(String str) {
		if (str == null)
			return 0;
		Integer ret = 0;
		try {
			ret = Integer.valueOf(str);
		} catch (Exception e) {
			// do nothing
		}
		return ret;
	}

	/**
	 * 长整型过滤器
	 * 
	 * @param str
	 * @return
	 */
	public static Long longFilter(String str) {
		if (str == null)
			return 0L;
		Long ret = 0L;
		try {
			ret = Long.valueOf(str);
		} catch (Exception e) {
			// do nothing
		}
		return ret;
	}

	/**
	 * 浮点型过滤器
	 * 
	 * @param str
	 * @return
	 */
	public static Float floatFilter(String str) {
		if (str == null)
			return 0F;
		Float ret = 0F;
		try {
			ret = Float.valueOf(str);
		} catch (Exception e) {
			// do nothing
		}
		return ret;
	}

	/**
	 * 日期过滤器
	 * 
	 * @param str
	 * @param df
	 * @return
	 */
	public static Date dateFilter(String str, String df) {
		Date date = null;
		if (str == null) {
			try {
				date = new SimpleDateFormat("yyyy-MM-dd").parse("1000-01-01");
			} catch (ParseException e) {
				e.printStackTrace();
			}
			return date;
		}
		SimpleDateFormat sdf = new SimpleDateFormat(df);
		try {
			date = sdf.parse(str);
		} catch (Exception e) {
			try {
				date = new SimpleDateFormat("yyyy-MM-dd").parse("1000-01-01");
			} catch (ParseException e1) {
				e1.printStackTrace();
			}
			return date;
		}
		return date;
	}

	/**
	 * 电话号码过滤器
	 * 
	 * @param phone
	 *            电话号码
	 * @param fault
	 *            若出错的返回值
	 * @return
	 */
	public static String phoneFilter(String phone, String fault) {
		if (phone == null)
			return fault;
		phone = phone.trim();
		// 情况1 ： 区号（3 or 4位）+电话号码（7 or 8位）+分机（2 or 4位）
		// 情况2 ： 手机（11位）
		// 情况3 ： 固话（7 or 8位）
		// 情况4 ： 区号（3 or 4位）+电话号码（7 or 8位）+电话号码（7 or 8位）
		String regEx = "^((\\d{3,4}(-)?)?\\d{7,8}(-(\\d{1,4})?)?|\\d{11}|\\d{3,4}(-)?\\d{7,8}-\\d{7,8})(/((\\d{3,4}(-)?)?\\d{7,8}(-(\\d{1,4})?)?|\\d{11}|\\d{3,4}-\\d{7,8}-\\d{7,8}))*$";
		Pattern p = Pattern.compile(regEx);
		Matcher matcher = p.matcher(phone);
		return matcher.matches() ? phone.endsWith("-") ? phone.substring(0, phone.length() - 1) : phone : fault;
	}

	/**
	 * 传真过滤器
	 * 
	 * @param fax
	 * @return
	 */
	public static String faxFilter(String fax) {
		if (fax == null)
			return "";
		fax = fax.trim();
		String regEx = "^(\\d{3,4}(-)?)?\\d{7,8}((-)?\\d{3,4})?(/(\\d{4}(-)?)?\\d{7,8}((-)?\\d{3,4})?)*$";
		Pattern p = Pattern.compile(regEx);
		Matcher matcher = p.matcher(fax);
		return matcher.matches() ? fax.charAt(4) != '-' ? fax.substring(0, 4) + "-" + fax.substring(4) : fax : "";
	}

	/**
	 * 电子邮件过滤器
	 * 
	 * @param email
	 * @return
	 */
	public static String emailFilter(String email) {
		if (email == null)
			return "";
		email = email.trim();
		// http://blog.csdn.net/make164492212/article/details/51656638
		String regEx = "^[a-zA-Z0-9._-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+(,[a-zA-Z0-9._-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+)*$";
		Pattern p = Pattern.compile(regEx);
		Matcher matcher = p.matcher(email);
		return matcher.matches() ? email : "";
	}

	/**
	 * 邮编过滤器
	 * 
	 * @param zipcode
	 * @return
	 */
	public static String zipcodeFilter(String zipcode) {
		if (zipcode == null)
			return "";
		zipcode = zipcode.trim();
		// http://blog.csdn.net/make164492212/article/details/51656638
		String regEx = "^\\d{6}$";
		Pattern p = Pattern.compile(regEx);
		Matcher matcher = p.matcher(zipcode);
		return matcher.matches() ? zipcode : "";
	}

	/**
	 * 图片地址过滤器
	 * 
	 * @param pic
	 * @return
	 */
	public static String fileFilter(String file, String[] suffixes) {
		if (file == null)
			return "";
		boolean isIn = false;
		file = file.trim();
		for (String suffix : suffixes) {
			if (file.endsWith(suffix)) {
				isIn = true;
				break;
			}
		}
		if (!isIn)
			return "";
		if (file.startsWith("/"))
			file = file.substring(1);
		return file;
	}

	public static String urlFilter(String url, String fault) {
		if (url == null)
			return "";
		url = url.trim();
		// 去掉“http://”
		if (url.startsWith("http://"))
			url = url.substring(7);
		// 去掉尾部多余的地址
		url = url.substring(0, url.indexOf('/') == -1 ? url.length() : url.indexOf('/'));
		// 小写
		url = url.toLowerCase();
		// 域名正则匹配(可过滤中文字符)
		String regEx = "^[a-zA-Z0-9//.//-]*(\\w+)?(:\\d++)?$";
		Pattern p = Pattern.compile(regEx);
		Matcher matcher = p.matcher(url);
		return matcher.matches() ? url : fault;
	}
}
